home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / m / RCS / floor.c,v < prev    next >
Text File  |  1990-02-16  |  5KB  |  224 lines

  1. head     1.3;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.3
  10. date     90.02.16.12.52.35;  author douglis;  state Exp;
  11. branches ;
  12. next     1.2;
  13.  
  14. 1.2
  15. date     89.09.25.17.32.39;  author rab;  state Exp;
  16. branches ;
  17. next     1.1;
  18.  
  19. 1.1
  20. date     89.09.25.17.07.21;  author rab;  state Exp;
  21. branches ;
  22. next     ;
  23.  
  24.  
  25. desc
  26. @@
  27.  
  28.  
  29. 1.3
  30. log
  31. @fixes for ds3100
  32. @
  33. text
  34. @/*
  35.  * Copyright (c) 1985 Regents of the University of California.
  36.  * All rights reserved.
  37.  *
  38.  * Redistribution and use in source and binary forms are permitted
  39.  * provided that this notice is preserved and that due credit is given
  40.  * to the University of California at Berkeley. The name of the University
  41.  * may not be used to endorse or promote products derived from this
  42.  * software without specific prior written permission. This software
  43.  * is provided ``as is'' without express or implied warranty.
  44.  *
  45.  * All recipients should regard themselves as participants in an ongoing
  46.  * research project and hence should feel obligated to report their
  47.  * experiences (good or bad) with these elementary function codes, using
  48.  * the sendbug(8) program, to the authors.
  49.  */
  50.  
  51. #ifndef lint
  52. static char sccsid[] = "@@(#)floor.c    5.3 (Berkeley) 5/21/88";
  53. #endif /* not lint */
  54.  
  55. #if defined(vax)||defined(tahoe)
  56. #ifdef vax
  57. #define _0x(A,B)    0x/**/A/**/B
  58. #else    /* vax */
  59. #define _0x(A,B)    0x/**/B/**/A
  60. #endif    /* vax */
  61. static long Lx[] = {_0x(0000,5c00),_0x(0000,0000)};    /* 2**55 */
  62. #define L *(double *) Lx
  63. #else    /* defined(vax)||defined(tahoe) */
  64. #ifdef __STDC__
  65. volatile static double L = 2 * 4503599627370496.0E0;        /* 2**53 */
  66. #else
  67. static double L = 2 * 4503599627370496.0E0;        /* 2**53 */
  68. #endif
  69. #endif    /* defined(vax)||defined(tahoe) */
  70. #ifdef ds3100
  71. #define MAXLONG 2147483648.0E0
  72. #endif
  73.  
  74. /*
  75.  * floor(x) := the largest integer no larger than x;
  76.  * ceil(x) := -floor(-x), for all real x.
  77.  *
  78.  * Note: Inexact will be signaled if x is not an integer, as is
  79.  *    customary for IEEE 754.  No other signal can be emitted.
  80.  */
  81. double
  82. floor(x)
  83. double x;
  84. {
  85.     double y,ceil();
  86.  
  87.     if (
  88. #if !defined(vax)&&!defined(tahoe)
  89.         x != x ||    /* NaN */
  90. #endif    /* !defined(vax)&&!defined(tahoe) */
  91.         x >= L)        /* already an even integer */
  92.         return x;
  93.     else if (x < (double)0)
  94.         return -ceil(-x);
  95. /*
  96.  * This will ensure floor() is computed correctly at least for values of x
  97.  * within the range of long's.
  98.  * The algorithm used otherwise gives bogus results on ds3100.
  99.  * E.g.: floor(1.0) = 0.0, floor(-3.0) = -3.0, etc.
  100.  */
  101. #ifdef ds3100
  102.     else if ( x < MAXLONG )
  103.         return (long)x;
  104. #endif
  105.     else {            /* now 0 <= x < L */
  106.         y = L+x;        /* destructive store must be forced */
  107.         y -= L;            /* an integer, and |x-y| < 1 */
  108.         return x < y ? y-(double)1 : y;
  109.     }
  110. }
  111.  
  112. double
  113. ceil(x)
  114. double x;
  115. {
  116.     double y,floor();
  117.  
  118.     if (
  119. #if !defined(vax)&&!defined(tahoe)
  120.         x != x ||    /* NaN */
  121. #endif    /* !defined(vax)&&!defined(tahoe) */
  122.         x >= L)        /* already an even integer */
  123.         return x;
  124.     else if (x < (double)0)
  125.         return -floor(-x);
  126. #ifdef ds3100
  127.     else if ( x < MAXLONG )
  128.         return x == (long)x ? x : (long)x + 1.0;
  129. #endif
  130.     else {            /* now 0 <= x < L */
  131.         y = L+x;        /* destructive store must be forced */
  132.         y -= L;            /* an integer, and |x-y| < 1 */
  133.         return x > y ? y+(double)1 : y;
  134.     }
  135. }
  136.  
  137. #ifndef national            /* rint() is in ./NATIONAL/support.s */
  138. /*
  139.  * algorithm for rint(x) in pseudo-pascal form ...
  140.  *
  141.  * real rint(x): real x;
  142.  *    ... delivers integer nearest x in direction of prevailing rounding
  143.  *    ... mode
  144.  * const    L = (last consecutive integer)/2
  145.  *       = 2**55; for VAX D
  146.  *       = 2**53; for IEEE 754 Double
  147.  * real    s,t;
  148.  * begin
  149.  *     if x != x then return x;        ... NaN
  150.  *     if |x| >= L then return x;        ... already an integer
  151.  *     s := copysign(L,x);
  152.  *     t := x + s;                ... = (x+s) rounded to integer
  153.  *     return t - s
  154.  * end;
  155.  *
  156.  * Note: Inexact will be signaled if x is not an integer, as is
  157.  *    customary for IEEE 754.  No other signal can be emitted.
  158.  */
  159. double
  160. rint(x)
  161. double x;
  162. {
  163.     double s,t,one = 1.0,copysign();
  164. #if !defined(vax)&&!defined(tahoe)
  165.     if (x != x)                /* NaN */
  166.         return (x);
  167. #endif    /* !defined(vax)&&!defined(tahoe) */
  168.     if (copysign(x,one) >= L)        /* already an integer */
  169.         return (x);
  170.     s = copysign(L,x);
  171.     t = x + s;                /* x+s rounded to integer */
  172.     return (t - s);
  173. }
  174. #else /* !national */
  175. /* 
  176.  * The ds3100 defines national but doesn't have the auxiliary routine
  177.  * mentioned above.
  178.  */
  179. #ifdef ds3100
  180. double
  181. rint(x)
  182. double x;
  183. {
  184.     register double fx = floor(x);
  185.  
  186.     if ( x - fx < 0.5 /* floor is the nearest int */ ||
  187.          x - fx == 0.5 && fx == 2.0 * floor(fx / 2.0)
  188.             /* floor is the nearest EVEN int */ )
  189.         return fx;
  190.     else
  191.         return fx + 1.0;
  192. }
  193. #endif /* ds3100 */
  194. #endif    /* not national */
  195. @
  196.  
  197.  
  198. 1.2
  199. log
  200. @Added an extra bit to `L'.  There are 52 bits of precision in
  201. an IEEE 754 double, but there is also a hidden bit in normalized
  202. numbers.  So there is really 53 bits.
  203. @
  204. text
  205. @d37 3
  206. d62 10
  207. d93 4
  208. d141 20
  209. @
  210.  
  211.  
  212. 1.1
  213. log
  214. @Initial revision
  215. @
  216. text
  217. @d31 5
  218. a35 1
  219. static double L = 4503599627370496.0E0;        /* 2**52 */
  220. d96 1
  221. a96 1
  222.  *       = 2**52; for IEEE 754 Double
  223. @
  224.